home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / ChangeDialog.C < prev    next >
C/C++ Source or Header  |  1990-12-04  |  4KB  |  179 lines

  1. //$ChangeDialog,ChangeAllCommand$
  2.  
  3. #include "RegularExp.h"
  4. #include "ChangeDialog.h"
  5. #include "Alert_e.h"
  6. #include "String.h"
  7. #include "TextView.h"
  8. #include "BorderItems.h"
  9. #include "OneOfCluster.h"
  10. #include "ManyOfCluster.h"
  11. #include "EditTextItem.h"
  12. #include "Buttons.h"
  13. #include "Window.h"
  14. #include "Document.h"
  15. #include "Expander.h"
  16. #include "Form.h"
  17.  
  18. //---- ChangeDialog ------------------------------------------------------------
  19.  
  20. MetaImpl(ChangeDialog, (TP(scopecl)));
  21.  
  22. ChangeDialog::ChangeDialog(char *title, TextView *tv) : FindDialog(title, tv)
  23. {
  24. }
  25.  
  26. VObject *ChangeDialog::DoCreateDialog()
  27. {
  28.     //---- dialog parts ----
  29.     VObject *findChange= 
  30.     new Form(cIdNone, eVObjHCenter, 2,
  31.         "Find:", ei1= new EditTextItem(cIdFind, "", 370),
  32.         "Change:", ei2= new EditTextItem(cIdChange, "", 370),
  33.         0);
  34.     findChange->SetFlag(eVObjVFixed);
  35.  
  36.     VObject *Mode=
  37.     new BorderItem ("Direction",
  38.         modecl= new OneOfCluster(cIdFindMode, eVObjHLeft, 0, "Forward", "Backward", 0),
  39.         Point(6,4)
  40.     );
  41.     VObject *Options=
  42.     new BorderItem ("Options",
  43.         optionscl= new ManyOfCluster(cIdFindOpt, eVObjHLeft, 0,
  44.                     "Ignore Case", "Match Whole Word", 0),
  45.         Point(6,4)
  46.     );
  47.  
  48.     VObject *ChangeAllScope=
  49.     new BorderItem ("Change All Scope",
  50.         scopecl= new OneOfCluster(cIdChangeAllScope, eVObjHLeft, 0,
  51.                     "All of Document", "Selection Only", 0),
  52.         Point(6,4)
  53.     );
  54.  
  55.     VObject *Actions=
  56.     new Expander (cIdNone, eHor, 10, 
  57.         new ActionButton (cIdDoFind, "Find Next", TRUE), 
  58.         new ActionButton (cIdDoChange, "Change, Then Find"), 
  59.         new ActionButton (cIdDoChangeAll, "Change All"),
  60.         0
  61.     );
  62.  
  63.     //---- overall layout ----
  64.     return
  65.     new BorderItem(
  66.         new Expander(cIdNone, eVert, 10,
  67.         findChange,
  68.         new Expander (cIdNone, eHor, 10,
  69.             Mode,
  70.             Options,
  71.             ChangeAllScope,
  72.             0 
  73.         ),
  74.         Actions,
  75.         0
  76.         ),
  77.         10, 0
  78.     );
  79. }
  80.  
  81. void ChangeDialog::SetupButtons()
  82. {
  83.     FindDialog::SetupButtons();
  84.     bool b= ei1->GetTextSize() > 0;
  85.     EnableItem(cIdDoChange, b);
  86.     EnableItem(cIdDoChangeAll, b);
  87.     EnableItem(cIdChangeBorder, b);
  88. }
  89.  
  90. void ChangeDialog::Control(int id, int p, void *v)
  91. {
  92.     switch (id) {
  93.  
  94.     case cIdDoChange:
  95.     DoChange(ei1, ei2->GetText());
  96.     break;
  97.  
  98.     case cIdDoChangeAll:
  99.     DoChangeAll(ei1, ei2->GetText());
  100.     break;
  101.  
  102.     default:
  103.     FindDialog::Control(id, p, v); 
  104.     break;
  105.     }
  106. }
  107.  
  108. void ChangeDialog::DoChange(EditTextItem *e, Text *c)
  109. {
  110.     int from, to, f1, t1;
  111.  
  112.     tvp->GetSelection(&from, &to);
  113.     bool forward= modecl->GetCurrentItem() == cIdForward;
  114.     
  115.     if (forward)
  116.     tvp->SetSelection(from, from);
  117.     else
  118.     tvp->SetSelection(to, to);
  119.     if (DoFind(e, forward)) {
  120.     tvp->GetSelection(&f1,&t1);
  121.     if (f1 == from && t1 == to) {
  122.         tvp->GetSelection(&from, &to);
  123.         tvp->PerformCommand(tvp->InsertText(c));
  124.         if (!forward)
  125.         tvp->SetSelection(from, from);
  126.         DoFind(ei1, forward);
  127.     }
  128.     }
  129.     tvp->RevealSelection();
  130. }
  131.  
  132. void ChangeDialog::DoChangeAll(EditTextItem *e, Text *c)
  133. {
  134.     if (ShowAlert(eAlertCaution, "\"Change All\" not undo-able, go ahead?") == cIdYes) {
  135.     int from, to;
  136.  
  137.     tvp->GetSelection(&from, &to);
  138.     if (scopecl->GetCurrentItem() == cIdChangeAll) {
  139.         from= 0;
  140.         to= tvp->GetText()->Size();
  141.     }
  142.     tvp->PerformCommand(new ChangeAllCommand(tvp, this, e, c, from, to));
  143.     }
  144. }
  145.  
  146. //---- class ChangeAllCommand -------------------------------------------------
  147.  
  148. ChangeAllCommand::ChangeAllCommand(TextView *tv, ChangeDialog *cd, 
  149.                     EditTextItem *fnd, Text* c, int f, int t)
  150.      : Command(cCHANGEALL, "ChangeAll", (CommandFlags)(eCmdCausesChange | eCmdDoDelete))
  151. {
  152.     tvp= tv;
  153.     changedialog= cd;
  154.     from= f;
  155.     to= t;
  156.     find= fnd;
  157.     change= c;
  158. };
  159.  
  160. void ChangeAllCommand::DoIt()
  161. {
  162.     int f, t, nChanges= 0;
  163.  
  164.     tvp->SetSelection(from, from);
  165.     while (!TestInterrupt("search") && changedialog->DoFind(find, TRUE, FALSE)) {
  166.     tvp->GetSelection(&f, &t);
  167.     if (t > to)
  168.         break;
  169.     tvp->Paste(change);
  170.     nChanges++;
  171.     }
  172.     if (nChanges) {
  173.     tvp->ForceRedraw();
  174.     tvp->RevealSelection();
  175.     tvp->UpdateEvent();
  176.     }
  177.     ShowAlert(eAlertNote, "%d occurrences changed", nChanges);
  178. }
  179.